"""作业：
1、通过python连接pymysql数据库，封装类方法
1.1、随机插入100条数据到数据库表，包括姓名、年龄、家庭住址、身份证号码
1.2、查询全部的数据
1.3、删除指定一条数据
1.4、封装批量删除方法，可以删除多条
1.5、可以指定增加单独一条数据到表里
以上每个操作步骤要写日志信息到log.txt里"""
import pymysql,random
from faker import Faker
from datetime import datetime
USER='root'
PASSWORD='123456'
HOST='120.27.199.203'
DATABASE='lnef'
faker = Faker(locale = 'zh_cn')
class Student:
    def connect(self):
        self.db = pymysql.connect(user= USER,password=PASSWORD,host=HOST,database=DATABASE,cursorclass =
        pymysql.cursors.DictCursor)
        self.cursor = self.db.cursor()
        str1 = f"当前时间为：{datetime.now()},连接数据库！"
        with open("log.txt",'a',encoding='utf-8') as f:
            f.write(str1 + "\n")
    def close(self):
        self.cursor.close()
        self.db.close()
        str1 = f"当前时间为：{datetime.now()},关闭数据库！"
        with open("log.txt", 'a', encoding='utf-8') as f:
            f.write(str1 + "\n")
    def insert_100_row(self):
        content_list = []
        self.connect()
        for i in range(100):
            name = faker.name() # 名字
            age = random.randint(19,60) # 年龄
            address = faker.address() # 家庭住址
            ssn = faker.ssn(min_age=18,max_age=60)
            str1 = f"insert into student2(name,age,address,ssn) values('{name}','{age}','{address}','{ssn}')"
            self.cursor.execute(str1) # 执行sql  使用cursor游标执行
            self.db.commit()
            str2 =  f"当前时间为：{datetime.now()}"+f"insert into student2(name,age,address,ssn) values('{name}','{age}','{address}','{ssn}')" + "\n"
            print(f"{str1}插入成功！")
            content_list.append(str2)
        with open("log.txt",'a',encoding='utf-8') as f:
            f.writelines(content_list)
        self.close()
    def searchAll(self):
        self.connect()
        self.cursor.execute("select * from student2")
        result = self.cursor.fetchall()
        for index,value in enumerate(result):
            print(f"第{index+1}条的数据为：{value}")
        else:
            print("输出完毕!")
        with open("log.txt",'a',encoding='utf-8') as f:
            f.write(f"当前时间：{datetime.now()}，执行了查询操作！")
        self.close()
    def delete_row(self,name):
        self.connect()
        str1 = f"delete from student2 where name='{name}'"
        self.cursor.execute(str1)
        self.db.commit()
        with open('log.txt','a',encoding='utf-8') as f:
            f.write(f"当前时间：{datetime.now()}，删除：{str1}  成功！" + "\n")
        self.close()
    def delete_row_(self,*names):
        content_list = []
        self.connect()
        for name in names:
            str1 = f"delete from student2 where name='{name}'"
            self.cursor.execute(str1)
            self.db.commit()
            print(f"删除：{name}数据成功！")
            str2 = f"当前时间：{datetime.now()}"+f"delete from student2 where name={name}" +"删除成功！" +"\n"
            content_list.append(str2)
        else:
            print("全部删除完毕！")
        with open('log.txt','a',encoding='utf-8') as f:
            f.writelines(content_list)
        self.close()
    def insert_one_row(self,name,age,address,ssn):
        self.connect()
        str1 = f"insert into student2(name,age,address,ssn) values('{name}','{age}','{address}','{ssn}')"
        self.cursor.execute(str1)
        self.db.commit()
        print(f"{str1}新增数据成功！")
        str2 =f"当前时间：{datetime.now()}" +f"insert into student2(name,age,address,ssn) values('{name}','{age}','{address}','{ssn}')" +"  新增成功！\n"
        with open('log.txt','a',encoding='utf-8') as f:
            f.write(str2)
        self.close()
if __name__ == '__main__':
    s1 = Student()
    # s1.insert_100_row()
    # s1.searchAll()
    # s1.delete_row("郭丽")
    # s1.delete_row_("王颖","张倩") #
    s1.insert_one_row("张三",93,"沈阳市","5343664563")

"""2、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法

存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
删除学生：删除的学生将不在展示
展示全部学生：可以看到全部的学生姓名
学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！

以上内容，需要连接数据库，每次的数据都需要增、删、改、查去做"""
import pymysql
import traceback # 可以将报错信息打印在控制台上面
USER='root'
PASSWORD='123456'
HOST='120.27.199.203'
DATABASE='lnef'
class DB:
    def __init__(self,user,password,host,database):
        self.user = user
        self.password = password
        self.host = host
        self.database = database
    def connect(self):
        self.db = pymysql.connect(user = self.user,password= self.password,host=self.host,database=self.database,cursorclass =
        pymysql.cursors.DictCursor)
        self.cursor = self.db.cursor()
    def close(self):
        self.cursor.close()
        self.db.close()
    def search(self,type:int,sql):
        self.connect()
        result = None
        if type == 1:
            try:
                self.cursor.execute(sql)
                result = self.cursor.fetchone()
                self.close()
                return result
            except:
                self.db.rollback()
                traceback.print_exc()
                return result
        elif type == 2:
            try:
                self.cursor.execute(sql)
                result = self.cursor.fetchall()
                self.close()
                return result
            except:
                self.db.rollback()
                traceback.print_exc()
                return result
    def __edit(self,sql):
        self.connect()
        try:
            self.cursor.execute(sql)
            self.db.commit()
            self.close()
        except:
            self.db.rollback()
            traceback.print_exc()
    def insert(self,sql):
        self.__edit(sql)
    def delete(self,sql):
        self.__edit(sql)
    def update(self,sql):
        self.__edit(sql)
if __name__ == '__main__':
    d1 = DB(USER,PASSWORD,HOST,DATABASE)
    # d1.insert("insert into student3(name,age,address,phone) values('张三',23,'沈阳','1111111')"))
    # d1.delete("delete from student3 where name = '张三'")
    # d1.update("update student3 set name='李四' where name='张三'")
    # print(d1.search(2, "select * from student3"))

"""3、类作业，统计镰刀和斧头的数量，要使用类方法"""
class LF:
    l_count = 0
    f_count = 0
    def __init__(self, name):
        self.name = name
        if name == "镰刀":
            LF.l_count += 1
        elif name == "斧头":
            LF.f_count += 1
    @classmethod
    def get_l(cls):
        return cls.l_count
    @classmethod
    def get_f(cls):
        return cls.f_count
if __name__ == '__main__':
    p1 = LF("镰刀")
    p2 = LF("斧头")
    print("镰刀的数量为：", LF.get_l())
    print("斧头的数量为：", LF.get_f())
"""4、新建学生成绩管理系统，随机生成100个 学生信息插入到数据库：
学生信息组成：学号、学生姓名、英语成绩、数学成绩、语文成绩、班级号（班级号有：1809A，1809B，1810A，1810B）

成绩划分为：优秀，良好，中等，及格，不及格。良好比中等好。

优秀：90—100之间（包括90）
良好：80-90
中等：70-80
及格：60-70
不合格：分数低于60分。

成绩管理系统提供以下方法：
《1》 查询所有英语成绩为优秀的、良好的、中等、及格和不合格的学生姓名和班级号
《2》 查询1809A，1809B，1810A，1810B每个班级的数学成绩，并且是降序返回
《3》 查询1809A，1809B，1810A，1810B每个班级的总人数，并且由大到小排序返回
《4》 查询英语、数学、语文成绩不合格的学生姓名和对应的班级号，按照不合格的人数，由大到小排序"""

"""5、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增、修改、删除的图书，都要出现在数据库中
新增：图书名、作者名称、新建年月日
修改：图书名、作者名称、新建年月日
删除：图书删掉，且不在展示
查看：全量查询、精确查询、模糊查询需要用户传入形参来控制返回结果"""